/**********************************************************************************************
***********************************************************************************************
***  File:			listas.h
***	 Author:		José Oniram / Elias Rachid
***	 Contents:		listas header file.
***********************************************************************************************
**********************************************************************************************/

#include <iostream>
#include <list>
#include <Gmatrix.h>

using namespace std;

struct lista_mapa{
  int color;
  double media_x;
  double media_y;
  double flag_land; 
};

struct lista_sensor{
  int color;
  double dist;
  double theta; 
  int flag;
};

// Significado do Flag

// Flag = 0 -> Não estamos vendo o Landmark
// Flag = 1 -> Estamos vendo o Landmark

// Tabela de Relação Número versus Cores
//
// Numero 	Cor
//   1		Red
//   2		Blue
//   3		Green
//   4		Cyan
//   5		Yellow
//   6		Magenta

// Protótipo das Funcões

// Gera a Lista que vai conter todas as informações sobre os Landmarks presentes no Mapa
void Inicializa_Lista_Mapa(list<lista_mapa> *Lista1);

// Inicializa a Lista que vai conter todas as informações fornecidas pelos sensores
void Inicializa_Lista_Sensor(list<lista_sensor> *Lista2);

// Atualiza a Lista com as melhores estimativas para os landmarks do Mapa
void Atualiza_Lista_Mapa(list<lista_mapa> *Lista1, PGMATRIX Matriz_Mapa);

// Atualiza a Lista com as informações fornecidas pelos sensores sobre os Landmarks observados
void Atualiza_Lista_Sensor(list<lista_sensor> *Lista2, double dist_new[], double theta_new[], int signature[]);

// Obtem a posição (X,Y) em relação ao referencial global para os Landmarks observados
int Ler_Lista_Mapa(list<lista_mapa> *Lista1, int sig_flag, double pos_landmark[]);

// Obtem (dist,theta) em relação ao referencial do Robo fornecido pelos Sensores
void Ler_Lista_Sensor(list<lista_sensor> *Lista2, int sig_flag, double z_landmark[]);

// Atualiza o flag do Landmark para inferir que ele já foi visto 1 vez
void Atualiza_Flag_Land(list<lista_mapa> *Lista1, int sig_flag, double media_landmark[]);
